from info import constants
from info import db
from info.utils.response_code import RET
from . import profile_blu
from ...utils.common import get_user_data
from flask import render_template, g, request, jsonify, session, current_app
from info.utils.pic_storage import pic_storage


@profile_blu.route('/pic_info', methods=["POST", "GET"])
@get_user_data
def pic_info():
    """展示修改头像页面&头像数据修改"""

    # GET请求：返回修改用户头像页面
    if request.method == "GET":
        return render_template("profile/user_pic_info.html")

    # POST请求：提交头像数据并修改保存
    """
    1.获取参数
        1.1 avatar:上传的图片数据, user:当前用户对象
    2.校验参数
        2.1 非空判断
    3.逻辑处理
        3.0 调用工具类将图片数据上传带七牛云
        3.1 将返回的图片名称给予avatar_url赋值，并保存回数据库
        3.2 将图片的完整url返回
    4.返回值
    """
    # 1.1 avatar:上传的图片数据, user:当前用户对象
    # avatar是一个文件对象，目前还不是二进制数据，需要read()后才是
    avatar = request.files.get('avatar')

    avatar_data = None
    try:
        # 获取图片的二进制格式数据
        avatar_data = avatar.read()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg="图片数据读取失败")
    # 获取当前登录用户
    user = g.user

    # 2.1 非空判断
    if not avatar_data:
        return jsonify(errno=RET.NODATA, errmsg="图片数据为空")

    if not user:
        return jsonify(errno=RET.SESSIONERR, errmsg="用户未登录")

    # 3.0 调用工具类将图片数据上传带七牛云
    try:
        pic_name = pic_storage(avatar_data)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR, errmsg="上传图片到七牛云异常")

    # 3.1 将返回的图片名称给予avatar_url赋值，并保存回数据库
    user.avatar_url = pic_name

    try:
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg="保存用户头像数据异常")

    # 3.2 将图片的完整url返回
    # http://pkt9kwyci.bkt.clouddn.com/ Fuu55jnDCHlCIVYi8bIRtmBKtDhi
    full_url = constants.QINIU_DOMIN_PREFIX + pic_name

    # 返回上传图片成功
    return jsonify(errno=RET.OK, errmsg="返回上传图片成功", data={"avatar_url": full_url})


@profile_blu.route('/base_info', methods=["POST", "GET"])
@get_user_data
def base_info():
    """用户基本资料页面"""
    user = g.user

    # get请求：返回用户基本信息
    if request.method == "GET":
        return render_template("profile/user_base_info.html", data={"user_info": user.to_dict() if user else None})

    # post请求，修改用户基本资料
    params_dict = request.json
    signature = params_dict.get("signature")
    nick_name = params_dict.get("nick_name")
    gender = params_dict.get("gender")

    if not all([signature, nick_name, gender]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数不足")
    if gender not in ["MAN", "WOMAN"]:
        return jsonify(errno=RET.PARAMERR, errmsg="参数异常")
    if not user:
        return jsonify(errno=RET.SESSIONERR, errmsg="用户未登录")
    # 修改信息
    user.signature = signature
    user.nick_name = nick_name
    user.gender = gender
    # 当前修改了个人信息，session缓存中的个人信息也要修改
    session["nick_name"] = nick_name
    try:
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DATAERR, errmsg="修改个人信息异常")

    return jsonify(errno=RET.OK, errmsg="修改个人信息成功")


@profile_blu.route('/info')
@get_user_data
def get_user_info():
    """个人中心
    获取用户信息
    """
    return render_template("profile/user.html", data={"user_info": g.user.to_dict() if g.user else None})